package com.geo.content.storage;

import com.geo.content.entity.MediaFile;

import java.io.InputStream;

/**
 * 存储服务接口
 * 
 * @author GEO Team
 * @version 1.0
 */
public interface StorageService {
    
    /**
     * 上传文件
     * @param inputStream 文件输入流
     * @param filePath 文件路径
     * @param contentType 内容类型
     * @return 文件访问URL
     */
    String uploadFile(InputStream inputStream, String filePath, String contentType);
    
    /**
     * 下载文件
     * @param filePath 文件路径
     * @return 文件字节数组
     */
    byte[] downloadFile(String filePath);
    
    /**
     * 删除文件
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    boolean deleteFile(String filePath);
    
    /**
     * 检查文件是否存在
     * @param filePath 文件路径
     * @return 是否存在
     */
    boolean fileExists(String filePath);
    
    /**
     * 获取文件访问URL
     * @param filePath 文件路径
     * @return 访问URL
     */
    String getFileUrl(String filePath);
    
    /**
     * 获取文件临时访问URL（带有效期）
     * @param filePath 文件路径
     * @param expireSeconds 过期时间（秒）
     * @return 临时访问URL
     */
    String getPresignedUrl(String filePath, int expireSeconds);
    
    /**
     * 获取存储位置类型
     * @return 存储位置
     */
    MediaFile.StorageLocation getStorageLocation();
    
    /**
     * 获取存储桶名称
     * @return 桶名称
     */
    String getBucketName();
    
    /**
     * 复制文件
     * @param sourcePath 源文件路径
     * @param targetPath 目标文件路径
     * @return 是否复制成功
     */
    boolean copyFile(String sourcePath, String targetPath);
    
    /**
     * 移动文件
     * @param sourcePath 源文件路径
     * @param targetPath 目标文件路径
     * @return 是否移动成功
     */
    boolean moveFile(String sourcePath, String targetPath);
    
    /**
     * 获取文件信息
     * @param filePath 文件路径
     * @return 文件信息
     */
    FileInfo getFileInfo(String filePath);
    
    /**
     * 文件信息类
     */
    class FileInfo {
        private String fileName;
        private long fileSize;
        private String lastModified;
        private String etag;
        
        // 构造函数、getter和setter
        public FileInfo() {}
        
        public FileInfo(String fileName, long fileSize, String lastModified, String etag) {
            this.fileName = fileName;
            this.fileSize = fileSize;
            this.lastModified = lastModified;
            this.etag = etag;
        }
        
        public String getFileName() { return fileName; }
        public void setFileName(String fileName) { this.fileName = fileName; }
        
        public long getFileSize() { return fileSize; }
        public void setFileSize(long fileSize) { this.fileSize = fileSize; }
        
        public String getLastModified() { return lastModified; }
        public void setLastModified(String lastModified) { this.lastModified = lastModified; }
        
        public String getEtag() { return etag; }
        public void setEtag(String etag) { this.etag = etag; }
    }
}